package com.lin.gameserver.protobuf;

/**
 * 协议命令号常量
 */
public class CommandId {
    // 消息选项常量
    public static final int OPT_SESSION_ID = 1;  // 会话ID选项键
    
    // 心跳消息
    public static final int CMD_HEARTBEAT_REQ = 100001;     // 心跳请求
    public static final int CMD_HEARTBEAT_RES = -100001;    // 心跳响应
    
    // 登录模块
    public static final int CMD_LOGIN_REQ = 100101;         // 登录请求
    public static final int CMD_LOGIN_RES = -100101;        // 登录响应
    
    /**
     * 将请求命令号转换为响应命令号
     *
     * @param reqCmd 请求命令号
     * @return 响应命令号
     */
    public static int toResponseCmd(int reqCmd) {
        if (reqCmd > 0) {
            return -reqCmd;
        }
        return reqCmd;  // 如果已经是负数，则返回原值
    }
    
    /**
     * 检查是否是请求命令号
     *
     * @param cmd 命令号
     * @return 是否是请求命令号
     */
    public static boolean isRequestCmd(int cmd) {
        return cmd > 0;
    }
    
    /**
     * 检查是否是响应命令号
     *
     * @param cmd 命令号
     * @return 是否是响应命令号
     */
    public static boolean isResponseCmd(int cmd) {
        return cmd < 0;
    }
    
    /**
     * 检查是否是服务器主动推送的命令号
     *
     * @param cmd 命令号
     * @return 是否是服务器推送命令号
     */
    public static boolean isNotifyCmd(int cmd) {
        // 服务器推送命令通常是以-2开头的命令号
        return cmd < 0 && Math.abs(cmd) >= 200000 && Math.abs(cmd) < 300000;
    }
    
    /**
     * 获取命令号描述
     *
     * @param cmd 命令号
     * @return 命令号描述
     */
    public static String getCommandDesc(int cmd) {
        switch (Math.abs(cmd)) {
            case 100001:
                return "心跳";
            case 100101:
                return "登录";
            default:
                return "未知命令: " + cmd;
        }
    }
} 